package com.lu.manage.modular.system.controller;

import com.lu.manage.core.base.controller.BaseController;
import com.lu.manage.core.common.global.SystemCache;
import com.lu.manage.core.common.node.TreeNodes;
import com.lu.manage.core.shiro.ShiroKit;
import com.lu.manage.core.shiro.ShiroUser;
import com.lu.manage.core.utils.ToolUtil;
import com.lu.manage.modular.system.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

/**
 * @program LuBoot
 * @description:
 * @author: zhanglu
 * @create: 2019-10-08 10:35:00
 */
@Controller
public class LoginController extends BaseController {

    @Autowired
    private UserService userService;

    /**
     * 跳转到主页
     * @return
     */
    @GetMapping("/")
    public String index(Model model){
        /*
            1、获取当前用户的角色列表
            2、根据角色与菜单的关联关系，找到对应的菜单按钮

            如果角色不存在或者菜单不存在，则跳转到登录页面。。。
         */
        //获取当前用户角色列表
        ShiroUser user = ShiroKit.getUserNotNull();
        List<String> roleList = user.getRoleList();

        if (roleList == null || roleList.size() == 0) {
            ShiroKit.getSubject().logout();
            return REDIRECT + "/login";
        }
        List<TreeNodes> menus = userService.getUserMenuNodes(roleList);
        model.addAttribute("menus", menus);
        model.addAttribute("avatar", ToolUtil.isEmpty(ShiroKit.getUser().getAvatar()) ? SystemCache.baseProperties.getAvatar() : ShiroKit.getUser().getAvatar());
        model.addAttribute("name", ShiroKit.getUser().getName());
        model.addAttribute("notice_title", SystemCache.baseProperties.getNotice_title());
        model.addAttribute("notice_message", SystemCache.baseProperties.getNotice_message());
        return "/index.html";
    }

    /**
     * 跳转到登录页面
     * @return
     */
    @GetMapping("/login")
    public String toLogin(){
        /*
            1、对用户认证信息校验
            2、检查用户信息是否存在

            不存在可跳   转到主页，主页会判断，再次跳转到登录页面
         */
        if(ShiroKit.isAuthenticated() || ShiroKit.getUser() != null){
            return REDIRECT + "/";
        }
        return "/login.html";
    }

    @PostMapping("/login")
    public String loginVali(String username, String password, String remember) throws Exception{

        /*
            1、获取shiro的主体，利用用户名、密码生成token
            2、根据 remember 可以在token设置是否记住我
            3、执行shiro的登录操纵
            4、登录成功记录日志
            5、跳转到主页
            如果登录成功，即可获取角色以及对应的菜单。。。
         */

        Subject subject = SecurityUtils.getSubject();
        System.out.println(password);
        UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray());
        if(remember.equals("on")) {
            token.setRememberMe(true);
        }else {
            token.setRememberMe(false);
        }
        subject.login(token);


        subject.getSession().setAttribute("sessionFlag", true);
        return REDIRECT + "/";
    }

    @GetMapping("/logout")
    public Object logout(){

        /*
            1、记录日志
            2、shiro退出
            3、删除cookie
         */
        ShiroKit.getSubject().logout();
        deleteAllCookie();
        return REDIRECT + "/login";
    }

}
